const createApp = require('./app');
const config = require('./config');
const logger = require('./utils/logger');

/**
 * 启动服务器
 */
async function startServer() {
  try {
    // 创建应用程序
    const { app, server, wsServer } = await createApp();
    
    // 启动HTTP服务器
    server.listen(config.server.port, () => {
      logger.info(`HTTP服务器已启动，运行在 http://localhost:${config.server.port}`);
      logger.info(`环境: ${config.server.env}`);
      logger.info(`API路径前缀: ${config.apiPrefix}`);
    });
    
    // 启动WebSocket服务器
    wsServer.listen(config.server.wsPort, () => {
      logger.info(`WebSocket服务器已启动，运行在 ws://localhost:${config.server.wsPort}`);
    });
    
    // 处理进程终止信号
    setupGracefulShutdown(server, wsServer);
    
  } catch (error) {
    logger.error(`服务器启动失败: ${error.message}`);
    logger.error(error.stack);
    process.exit(1);
  }
}

/**
 * 设置优雅关闭
 * @param {Object} server - HTTP服务器实例
 * @param {Object} wsServer - WebSocket服务器实例
 */
function setupGracefulShutdown(server, wsServer) {
  // 处理进程终止信号
  const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
  
  signals.forEach(signal => {
    process.on(signal, () => {
      logger.info(`收到 ${signal} 信号，正在关闭服务器...`);
      
      // 关闭HTTP服务器
      server.close(() => {
        logger.info('HTTP服务器已关闭');
        
        // 关闭WebSocket服务器
        wsServer.close(() => {
          logger.info('WebSocket服务器已关闭');
          process.exit(0);
        });
      });
      
      // 如果在一定时间内无法正常关闭，则强制退出
      setTimeout(() => {
        logger.error('无法正常关闭服务器，强制退出');
        process.exit(1);
      }, 10000);
    });
  });
  
  // 处理未捕获的异常
  process.on('uncaughtException', error => {
    logger.error(`未捕获的异常: ${error.message}`);
    logger.error(error.stack);
  });
  
  // 处理未处理的Promise拒绝
  process.on('unhandledRejection', (reason, promise) => {
    logger.error('未处理的Promise拒绝');
    logger.error(reason);
  });
}

// 启动服务器
startServer();